zz_

src/lcm.js

zzmq.dev@gmail.com[dev3]/mathkit[add-lcm-b-function-returns-least-common] / src / lcm.js @ e5bd6781 Download
Ladder Summary
  • file Export gcd function alongside lcm and update index.js to re-export gcd
/**
 * Computes the greatest common divisor (GCD) of two integers using the Euclidean algorithm.
 *
 * @param {number} a
 * @param {number} b
 * @returns {number} Non‑negative GCD of a and b.
 */
export function gcd(a, b) {
  a = Math.abs(a);
  b = Math.abs(b);
  while (b !== 0) {
    const temp = b;
    b = a % b;
    a = temp;
  }
  return a;
}

/**
 * Returns the least common multiple (LCM) of two integers.
 *
 * @param {number} a
 * @param {number} b
 * @returns {number} The LCM, or NaN if either argument is not an integer.
 */
export function lcm(a, b) {
  if (typeof a !== "number" || typeof b !== "number") return NaN;
  if (!Number.isInteger(a) || !Number.isInteger(b)) return NaN;
  if (a === 0 || b === 0) return 0;
  const divisor = gcd(a, b);
  return Math.abs((a / divisor) * b);
}

import { test } from "node:test";
import assert from "node:assert/strict";

test("lcm basic cases", () => {
  assert.strictEqual(lcm(4, 6), 12);
  assert.strictEqual(lcm(21, 6), 42);
  assert.strictEqual(lcm(0, 5), 0);
  assert.strictEqual(lcm(5, 0), 0);
  assert.strictEqual(lcm(5, 5), 5);
  assert.strictEqual(lcm(-3, 5), 15);
  assert.strictEqual(lcm(-4, -6), 12);
});

test("lcm with non‑integer inputs returns NaN", () => {
  assert.ok(Number.isNaN(lcm(2.5, 4)));
  assert.ok(Number.isNaN(lcm(3, 4.1)));
});